package com.gwi.springboot.vo;

import java.math.BigDecimal;
import java.util.*;

public class VoucherTest {

    public static void main(String[] args) {
        List<Voucher> vouchers = new ArrayList<>();
        vouchers.add(new Voucher("1",new Date("2020/1/1"),new BigDecimal("10.9")));
        vouchers.add(new Voucher("2",new Date("2010/1/1"),new BigDecimal("10.7")));
        vouchers.add(new Voucher("3",new Date("2000/1/1"),new BigDecimal("10.8")));
        vouchers.add(new Voucher("4",new Date("2020/1/1"),new BigDecimal("10.6")));
        preview(new BigDecimal("30"),vouchers);
    }

    /**
     *
     * @param total 订单金额
     * @param vouchers 顾客账户中有效的劵列表, 劵列表无序
     * @return 返回被核销的劵号列表
     */
    static List<String> preview(BigDecimal total, List<Voucher> vouchers){
        System.out.println("排序前：" + vouchers);
        List<String> listGo = new ArrayList<>();
        /**
         * 代金券的核销逻辑为:每个订单可核销多张代金券(直至订单金额被全部抵扣掉或代金券全部被核销为止)，
         * 优先核销先到期的券，到期日期相同时优先核销面额低的券。
         */
        //第一步先获取出先到期的优惠劵，如果日期相同比较面额
        Collections.sort(vouchers, new Comparator<Voucher>() {
            @Override
            public int compare(Voucher o1, Voucher o2) {//两个对象比较
                //compareTo比较如果参数字符串等于此字符串，则返回值 0；
                //compareTo如果此字符串小于字符串参数，则返回一个小于 0 的值；
                //compareTo如果此字符串大于字符串参数，则返回一个大于 0 的值。
                int flag = o1.getExpiryDate().compareTo(o2.getExpiryDate());
                if(flag == 0){
                    flag = o1.getFaceValue().compareTo(o2.getFaceValue());
                }
                return flag;
            }
        });
        System.out.println("排序后：" + vouchers);
        //第二步 通过排序后的list 进行劵的金额  相减操作。
        for (Voucher list:vouchers) {
            //如果total小于当前的劵金额 那么结束掉
            if(total.compareTo(list.getFaceValue()) != -1){
                //满足的添加到list
                listGo.add(list.getVoucherNo());
                //相减操作并赋值
                total = total.subtract(list.getFaceValue());
            }
        }
        System.out.println("劵号：" + listGo);
        return listGo;


    }

}
